package main

// go + channel
// 等待任务结束
// 一次性任务：使用空结构体传递信号
// https://www.yuque.com/qyuhen/go/ee7gen

import (
	"errors"
	"fmt"
	"time"
)

func spawn(f func() error) <-chan error {
	c := make(chan error)

	// 子 goroutine
	go func() {
		// 执行操作结束后，向 channel 发送数据或信号
		c <- f()
	}()

	return c
}

func main() {
	c := spawn(func() error {
		// 模拟耗时操作
		time.Sleep(2 * time.Second)

		return errors.New("timeout")
	})

	// main goroutine 阻塞这里，等待任务结束
	// 比 time.Sleep 更优雅
	fmt.Println(<-c)
}
